﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data;
using Microsoft.Practices.Unity;
using System.Web.Mvc;

namespace Echegoyen.Models
{

    [Table("Materiales")]
    public class Material
    {
        private IContext db;

        public Material() : this(DependencyResolver.Current.GetService<IContext>()) { }

        public Material(IContext db)
        {
            this.db = db;
        }

        public Material(IContext db, int id, string titulo, TipoMaterial tipo, string sinopsis, Editorial editorial, ICollection<Tema> temas, ICollection<Autor> autores) {

            this.db = db;
            this.MaterialId = id;
            this.Titulo = titulo;
            this.TipoMaterial = tipo;
            this.Tema = temas;
            this.Editorial = editorial;
            this.Sinopsis = sinopsis;
            this.Autores = autores;
            this.Reservas = new List<Reserva>();
        }

        public int MaterialId { get; set; }

        public int TipoMaterialId { get; set; }
        public virtual TipoMaterial TipoMaterial { get; set; }

        public int EditorialId { get; set; }
        public virtual Editorial Editorial { get; set; }

        public string Titulo { get; set; }
        public string Sinopsis { get; set; }

        public ICollection<int> TemaId { get; set; }
        public virtual ICollection<Tema> Tema { get; set; }

        public ICollection<int> AutoresId { get; set; }
        public virtual ICollection<Autor> Autores { get; set; }

        public virtual ICollection<Reserva> Reservas { get; set; }


        // null si no hay
        public Ejemplar ObtenerDisponible()
        {
            Ejemplar toRet = null;

            foreach (Ejemplar ej in db.Ejemplar.Where(e => e.Material == this).ToList())
            {
                if(ej.ObtenerEstado().Equals("Finalizado"))
                    return ej;
            }       

            return toRet;
        }


        // Frente a un ejemplar nuevo o una devolución, convierte una reserva en un préstamo asignado y devuelve la Reserva que satisfizo.
        public Reserva AsignarUno()
        {
            Reserva r;
                
            List<Reserva> rs = Reservas.Where(x => x.Estado.Equals("Pendiente")).OrderBy(t => t.Fecha).ToList();
            if (rs.Count == 0) 
                return null; // No había reservas.
            else
                r = rs[0];

            // Si en estos casos no hago Find, se crea una copia.
            db.Reserva.Find(r.ReservaId).Concretar();
            db.Prestamo.Add(new Prestamo(0, db.Usuario.Find(r.UsuarioId), db.Ejemplar.Find(ObtenerDisponible().EjemplarId), DateTime.Now));
            db.SaveChanges();

            return r;
        }

    }
}
